// SpryXML.js - version 0.4 - Spry Pre-Release 1.6
//
// Copyright (c) 2007. Adobe Systems Incorporated.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
//   * Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//   * Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//   * Neither the name of Adobe Systems Incorporated nor the names of its
//     contributors may be used to endorse or promote products derived from this
//     software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.

var Spry;if(!Spry)Spry={};if(!Spry.XML)Spry.XML={};if(!Spry.XML.Schema)Spry.XML.Schema={};Spry.XML.Schema.Node=function(nodeName)
{this.nodeName=nodeName;this.isAttribute=false;this.appearsMoreThanOnce=false;this.children=new Array;};Spry.XML.Schema.Node.prototype.toString=function(indentStr)
{if(!indentStr)
indentStr="";var str=indentStr+this.nodeName;if(this.appearsMoreThanOnce)
str+=" (+)";str+="\n";var newIndentStr=indentStr+"    ";for(var $childName in this.children)
{var child=this.children[$childName];if(child.isAttribute)
str+=newIndentStr+child.nodeName+"\n";else
str+=child.toString(newIndentStr);}
return str;};Spry.XML.Schema.mapElementIntoSchemaNode=function(ele,schemaNode)
{if(!ele||!schemaNode)
return;var i=0;for(i=0;i<ele.attributes.length;i++)
{var attr=ele.attributes.item(i);if(attr&&attr.nodeType==2)
{var attrName="@"+attr.name;if(!schemaNode.children[attrName])
{var attrObj=new Spry.XML.Schema.Node(attrName);attrObj.isAttribute=true;schemaNode.children[attrName]=attrObj;}}}
var child=ele.firstChild;var namesSeenSoFar=new Array;while(child)
{if(child.nodeType==1)
{var childSchemaNode=schemaNode.children[child.nodeName];if(!childSchemaNode)
{childSchemaNode=new Spry.XML.Schema.Node(child.nodeName);if(childSchemaNode)
schemaNode.children[child.nodeName]=childSchemaNode;}
if(childSchemaNode)
{if(namesSeenSoFar[childSchemaNode.nodeName])
childSchemaNode.appearsMoreThanOnce=true;else
namesSeenSoFar[childSchemaNode.nodeName]=true;}
Spry.XML.Schema.mapElementIntoSchemaNode(child,childSchemaNode);}
child=child.nextSibling;}};Spry.XML.getSchemaForElement=function(ele)
{if(!ele)
return null;schemaNode=new Spry.XML.Schema.Node(ele.nodeName);Spry.XML.Schema.mapElementIntoSchemaNode(ele,schemaNode);return schemaNode;};Spry.XML.getSchema=function(xmlDoc)
{if(!xmlDoc)
return null;var node=xmlDoc.firstChild;while(node)
{if(node.nodeType==1)
break;node=node.nextSibling;}
return Spry.XML.getSchemaForElement(node);};Spry.XML.nodeHasValue=function(node)
{if(node)
{var child=node.firstChild;if(child&&child.nextSibling==null&&(child.nodeType==3||child.nodeType==4))
return true;}
return false;};Spry.XML.XObject=function()
{};Spry.XML.XObject.prototype._value=function()
{var val=this["#text"];if(val!=undefined)
return val;return this["#cdata-section"];};Spry.XML.XObject.prototype._hasValue=function()
{return this._value()!=undefined;};Spry.XML.XObject.prototype._valueIsText=function()
{return this["#text"]!=undefined;};Spry.XML.XObject.prototype._valueIsCData=function()
{return this["#cdata-section"]!=undefined;};Spry.XML.XObject.prototype._propertyIsArray=function(prop)
{var val=this[prop];if(val==undefined)
return false;return(typeof val=="object"&&val.constructor==Array);};Spry.XML.XObject.prototype._getPropertyAsArray=function(prop)
{var arr=[];var val=this[prop];if(val!=undefined)
{if(typeof val=="object"&&val.constructor==Array)
return val;arr.push(val);}
return arr;};Spry.XML.XObject.prototype._getProperties=function()
{var props=[];for(var p in this)
{if(!/^_/.test(p))
props.push(p);}
return props;};Spry.XML.nodeToObject=function(node)
{if(!node)
return null;var obj=new Spry.XML.XObject();for(var i=0;i<node.attributes.length;i++)
{var attr=node.attributes[i];var attrName="@"+attr.name;obj[attrName]=attr.value;}
var child;if(Spry.XML.nodeHasValue(node))
{try
{child=node.firstChild;if(child.nodeType==3)
obj[child.nodeName]=Spry.Utils.encodeEntities(child.data);else if(child.nodeType==4)
obj[child.nodeName]=child.data;}catch(e){Spry.Debug.reportError("Spry.XML.nodeToObject() exception caught: "+e+"\n");}}
else
{child=node.firstChild;while(child)
{if(child.nodeType==1)
{var isArray=false;var tagName=child.nodeName;if(obj[tagName])
{if(obj[tagName].constructor!=Array)
{var curValue=obj[tagName];obj[tagName]=new Array;obj[tagName].push(curValue);}
isArray=true;}
var childObj=Spry.XML.nodeToObject(child);if(isArray)
obj[tagName].push(childObj);else
obj[tagName]=childObj;}
child=child.nextSibling;}}
return obj;};Spry.XML.documentToObject=function(xmlDoc)
{var obj=null;if(xmlDoc&&xmlDoc.firstChild)
{var child=xmlDoc.firstChild;while(child)
{if(child.nodeType==1)
{obj=new Spry.XML.XObject();obj[child.nodeName]=Spry.XML.nodeToObject(child);break;}
child=child.nextSibling;}}
return obj;};